/*****************************************
 *  所属版本  武汉天瑞兴科技有限公司  *
 *****************************************/
package com.adds.lvds.core.trace;

import java.util.HashMap;
import java.util.Properties;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 * 
 *项目名称 ：lvds-web-utils
 *@author zhangjian
 *@time 2017-3-16上午11:36:18
 */
public class TraceService {

	private static String LVDS = "lvds";
	/**
	 * 存放Logger的HashMap
	 */
	static HashMap<String, Logger> hmErr = new HashMap<String, Logger>();

	static Logger logger = null;

	/**
	 * 获取Logger的配置信息及初始化工作 *
	 */
	public static void init() {

		logger = Logger.getLogger(LVDS);

		TraceTools trace = new TraceTools();
		Properties props = trace.setupConfig();
		PropertyConfigurator.configure(props);
		//控制日志输出模式
		//Logger.getLogger("uk.ltd.getahead.dwr").getParent().setLevel(Level.DEBUG);
		hmErr.put(LVDS, logger);
	}

	/**
	 * 判断DEBUG级别是否可用
	 *  
	 * @return
	 */
	public static boolean isDebugEnabled(){
		return logger.isEnabledFor(Level.DEBUG);
	}
	
	/**
	 * 判断INFO级别是否可用
	 *  
	 * @return
	 */
	public static boolean isInfoEnabled(){
		
		return logger.isEnabledFor(Level.INFO);
	}
	
	/**
	 * 判断ERROR级别是否可用
	 *  
	 * @return
	 */
	public static boolean isErrorEnabled(){
		
		return logger.isEnabledFor(Level.ERROR);
	}
	
	/**
	 * 判断WARN级别是否可用
	 *  
	 * @return
	 */
	public static boolean isWarnEnabled(){
		
		return logger.isEnabledFor(Level.WARN);
	}
	
	/**
	 * 判断FATAL级别是否可用
	 *  
	 * @return
	 */
	public static boolean isFatalEnabled(){
		
		return logger.isEnabledFor(Level.FATAL);
	}
	
	/**
	 * 用户调试信息输出
	 * 
	 * @param aType
	 *            模块所属的类型
	 * @param debugMsg
	 *            调试信息
	 */
	public static void debug(String aType,
			String debugMsg) {
		if (hmErr.isEmpty()) {
			init();
		}

		Logger log = (Logger) hmErr.get(LVDS);
		if (log == null) {
			return;
		}

		log.debug("[" + TraceTools.transTraceModule(aType) + "] - " + debugMsg);
	}

	/**
	 * 用户输出的关键信息
	 * 
	 * @param aType
	 *            模块所属的类型
	 * @param infoMsg
	 *            关键信息
	 */
	public static void info(String aType, 
			String infoMsg) {
		if (hmErr.isEmpty()) {
			init();
		}
		Logger log = (Logger) hmErr.get(LVDS);
		if (log == null) {
			return;
		}

		log.info("[" + TraceTools.transTraceModule(aType) + "] - " + infoMsg);
	}

	/**
	 * 以用户自定义字符串作为错误输出
	 * 
	 * @param aType
	 *            模块所属的类型
	 * @param errMsg
	 *            错误信息
	 */
	public static void error(String aType, 
			String errMsg) {
		if (hmErr.isEmpty()) {
			init();
		}
		Logger log = (Logger) hmErr.get(LVDS);
		if (log == null) {
			return;
		}

		log.error("[" + TraceTools.transTraceModule(aType) + "] - " + errMsg);
	}

	/**
	 * 以用户自定义字符串作为错误输出
	 * 
	 * @param aType
	 *            模块所属的类型
	 * @param errMsg
	 *            错误信息
	 */
	public static void fatal(String aType,
			String fatMsg) {
		if (hmErr.isEmpty()) {
			init();
		}
		Logger log = (Logger) hmErr.get(LVDS);
		if (log == null) {
			return;
		}

		log.fatal("[" + TraceTools.transTraceModule(aType) + "] - " + fatMsg);
	}

	/**
	 * 以用户自定义字符串作为错误输出
	 * 
	 * @param aType
	 *            模块所属的类型
	 * @param errMsg
	 *            错误信息
	 */
	public static void error(String aType, 
			String errMsg, Throwable cause) {
		if (hmErr.isEmpty()) {
			init();
		}
		Logger log = (Logger) hmErr.get(LVDS);
		if (log == null) {
			return;
		}
		StringBuffer sb = new StringBuffer();
//		if (cause instanceof MasException) {
//			sb.append(((MasException) cause).getMessage());
//		} else {
			StackTraceElement[] elements = cause.getStackTrace();

			for (int i = 0; i < elements.length; i++) {
				sb.append(((StackTraceElement) elements[i]).toString());
				sb.append("\n");
			}
			sb.append(cause.toString());
//		}
		log.error("[" + TraceTools.transTraceModule(aType) + "] - " + errMsg + "\n"
				+ sb.toString());
	}
}
